package Simulacion;

/**
 * Universidad del Valle de Guatemala
 * Algoritmos y Estructura de Datos
 * @author Juan Pablo Argueta, 11033
 * 13 de noviembre del 2012
 */

import Grafos.*;
import java.util.ArrayList;
import java.util.Iterator;
/**
 * Clase que construye un Simulador de Transferencia de Datos
 * @param <V> 
 * @param <E> 
 */
public class Simulator<V,E> {
    private ArrayList<Double> vectorMax;
    private double[] est;
    private double tiempot, minEdge, maxEdge, promEdge, tEdge, velocidad;
    private V v1, v2;
    
    /**
     * Construye un Nuevo Simulador inicializando algunos atributos.
     */
    public Simulator(){
        est = new double[3];
    }
    
    /**
     *
     * @param graphD
     * @param peso
     * @param name
     * @return
     */
    public double[] getEstadistica(Graph graphD, int peso, String name){
        est = new double[3];
        vectorMax = new ArrayList<Double>();
        Iterator <V> viter = graphD.iterator();
        while (viter.hasNext()){
            V v = viter.next();
            ComponenteRed x = (ComponenteRed)v;
            if (x.getNombreComponente().equals(name)){
                Iterator <V> uniter = graphD.iterator();
                while (uniter.hasNext()){ 
                    V u = uniter.next();
                    ComponenteRed y = (ComponenteRed)u;
                    if (y.iscompu){
                       //Se comprueba si existe una comunicación entre dos vértices.
                        if(graphD.containsEdge(u,v)){
                            vectorMax.add((Double)graphD.getEdge(u,v).label());
                        } 
                    } 
                }
            }     
        }
        
        if (vectorMax.isEmpty()){
            est[0] = 0;
            est[1] = 0;
            est[2] = 0;
            
            return est;
        }
        minEdge = vectorMax.get(0);
        maxEdge = tEdge =  promEdge = 0;
        for(int i=0; i<vectorMax.size(); i++){
            if( minEdge >= vectorMax.get(i)){
                minEdge = vectorMax.get(i);
            }
            if (maxEdge<= vectorMax.get(i)){
                maxEdge = vectorMax.get(i);
            }
            tEdge += (1/vectorMax.get(i));
        }
        promEdge = (tEdge/vectorMax.size());
        
        est[1] = (1/minEdge);
        est[0] = (1/maxEdge);
        est[2] = promEdge;
        
        return est; 
    }
    
    /**
     *
     * @param graph
     * @param name1
     * @param name2
     * @param peso
     * @return
     */
    public double getTiempoTransferencia(Graph graph, String name1, String name2, int peso){
        tiempot = 0;
        velocidad = 0;
        boolean vv1 = false, vv2 = false;
        Iterator <V> viter = graph.iterator();
        while (viter.hasNext()){
            V v = viter.next();
            ComponenteRed x = (ComponenteRed)v;
            if (x.getNombreComponente().equalsIgnoreCase(name1)){
                v1 = v;
                vv1 = true;
            } else if(x.getNombreComponente().equalsIgnoreCase(name2)) {
                v2 = v;
                vv2 = true;
            }
              
        }
        
        if ((vv2)&&(vv1)){
            if (graph.containsEdge(v1, v2)){
                velocidad = ((Double)graph.getEdge(v1,v2).label());
            } 
        }
        
        tiempot = velocidad*peso;
        return tiempot;
    }
    
}
